﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Stockholm.SOA.Kaskelot.WCF.DataContracts
{
	public class PersonData
	{
		private const string DefaultKonto = "50 0300 ";
		private const string AFKonto = "50 0300 ";
		private const string MGKonto = "70 0300 ";
		private const string OXKonto = "80 0300 ";

		public string Personnummer { get; set; }

		public DateTime ValDatum { get; set; }
		public string Fornamn { get; set; }
		public string Efternamn { get; set; }
		public string GatuAdress { get; set; }
		public string PostNr { get; set; }
		public string PostOrt { get; set; }

		public string FunktionsKod { get; set; }
		public int Arvode { get; set; }
		public double MilErsattning { get; set; }
		public double TaxiUtlagg { get; set; }

		public string ValkretsNamn { get; set; }
		public string ForsamlingNamn { get; set; }
		public string ValdistriktNamn { get; set; }
		public string Uppdrag { get; set; }

		public string AnsokanPersonFornamn { get; set; }
		public string AnsokanPersonEfternamn { get; set; }
		public string AnsokanPersonNummer { get; set; }
		public string AnsokanAdress { get; set; }
		public string AnsokanPostAdress { get; set; }
		public string AnsokanFritext { get; set; }

		public string PersonFilRad
		{
			get
			{
				string result = "";

				result += Personnummer.Replace("-", "").Substring(2, 10);
				result += Fastbredd(Fornamn.ToUpper().Trim(), 20);
				result += Fastbredd(Efternamn.ToUpper().Trim(), 26);
				result += Fastbredd("", 20);
				result += Fastbredd(GatuAdress != null ? GatuAdress.Trim().ToUpper() : "", 27);
				result += Fastbredd(PostNr != null ? PostNr.Trim().Replace(" ", "") : "", 5);

				result += FastbreddLeft(ValDatum.Year.ToString(), 2, '0');
				result += ValDatum.Month.ToString().PadLeft(2, '0');
				result += "01"; // Day of month, alltid den första

				result += "517  10813 10801009905        70000050 0300";

				return result;
			}
		}

		public string LonFilRad
		{
			get
			{
				string result = "";

				if (Arvode >= 0)
				{
					result += "L46108  ";
					result += Personnummer.Replace("-", "").Substring(2, 10);
					result += "108011";
					result += FastbreddLeft(ValDatum.Year.ToString(), 2, '0');
					result += ValDatum.Month.ToString().PadLeft(2, '0');
					result += "01";													// Day of month, alltid den första
					result += FastbreddLeft(ValDatum.Year.ToString(), 2, '0');
					result += ValDatum.Month.ToString().PadLeft(2, '0');
					result += DateTime.DaysInMonth(ValDatum.Year, ValDatum.Month);	// Day of month, alltid den sista
					result += "11930000000000000";
					result += FastbreddLeft(Arvode.ToString(), 6, '0');

					result += "00 1000                       6 ";
					result += GetKonto();
					result += "K";
				}

				if (TaxiUtlagg > 0)
				{
					result += "\r\n";
					result += "L46108  ";
					result += Personnummer.Replace("-", "").Substring(2, 10);
					result += "108011";
					result += FastbreddLeft(ValDatum.Year.ToString(), 2, '0');
					result += ValDatum.Month.ToString().PadLeft(2, '0');
					result += "01";													// Day of month, alltid den första
					result += FastbreddLeft(ValDatum.Year.ToString(), 2, '0');
					result += ValDatum.Month.ToString().PadLeft(2, '0');
					result += DateTime.DaysInMonth(ValDatum.Year, ValDatum.Month);	// Day of month, alltid den sista
					result += "83780000000000000";

					var parts = TaxiUtlagg.ToString().Split(new string[] { "," }, StringSplitOptions.None);
					result += parts[0].PadLeft(6, '0');
					if (parts.Length > 1)
						result += parts[1].PadRight(2, '0');
					else
						result += "00";

					result += " 1000                         ";
					result += GetKonto();
					result += "K";
				}

				if (MilErsattning > 0)
				{
					result += "\r\n";
					result += "L46108  ";
					result += Personnummer.Replace("-", "").Substring(2, 10);
					result += "108011";
					result += FastbreddLeft(ValDatum.Year.ToString(), 2, '0');
					result += ValDatum.Month.ToString().PadLeft(2, '0');
					result += "01";													// Day of month, alltid den första
					result += FastbreddLeft(ValDatum.Year.ToString(), 2, '0');
					result += ValDatum.Month.ToString().PadLeft(2, '0');
					result += DateTime.DaysInMonth(ValDatum.Year, ValDatum.Month);	// Day of month, alltid den sista
					result += "83560000000000000";

					var parts = MilErsattning.ToString().Split(new string[] { ",", "." }, StringSplitOptions.None);
					result += parts[0].PadLeft(6, '0');
					if (parts.Length > 1)
						result += parts[1].PadRight(2, '0');
					else
						result += "00";

					result += " 1000                         ";
					result += GetKonto();
					result += "K";
				}

				return result;
			}
		}

		private string GetKonto()
		{
			switch (FunktionsKod.Trim())
			{
				case "A":
				case "B":
				case "C":
				case "D":
				case "E":
				case "F":
					return Fastbredd(AFKonto, 45);
				case "MG":
				case "MGH":
					return Fastbredd(MGKonto, 45);
				case "OA1":
				case "OA2":
				case "OA3":
				case "OA4":
				case "OA5":
				case "OA6":
				case "OB1":
				case "OB2":
				case "OB3":
				case "OB4":
				case "OB5":
				case "OB6":
					return Fastbredd(OXKonto, 45);
				default:
					return Fastbredd(DefaultKonto, 45);
			}
		}

		private string Fastbredd(string s, int tecken)
		{
			return Fastbredd(s, tecken, ' ');
		}

		private string Fastbredd(string s, int tecken, char filler)
		{
			string result = String.Empty;

			if (s == null)
				s = String.Empty;

			if (s.Length > tecken)
				result = s.Substring(0, tecken);
			else
				result = s.PadRight(tecken, filler);

			return result;
		}

		private string FastbreddLeft(string s, int tecken, char filler)
		{
			string result = String.Empty;

			if (s == null)
				s = String.Empty;

			if (s.Length > tecken)
				result = s.Substring(s.Length - tecken, tecken);
			else
				result = s.PadLeft(tecken, filler);

			return result;
		}
	}
}
